home *** CD-ROM | disk | FTP | other *** search
/ Nebula 1 / Nebula One.iso / Internet / News / Alexandra.0.82 / Source / NiceStuff.subproj / MiscURICell.m < prev    next >
Encoding:
Text File  |  1996-02-07  |  6.6 KB  |  199 lines

  1.  
  2. #import "MiscURICell.h"
  3. #import <misckit/misckit.h>
  4.  
  5. //---------------------------------------------------------------------------------------
  6.  
  7. NXAtom W3URIPboardType=NULL;
  8.  
  9. //---------------------------------------------------------------------------------------
  10.     @implementation MiscURICell:Cell
  11. //---------------------------------------------------------------------------------------
  12.  
  13. /*" blah...
  14.     
  15.     When a double-click is detected the cell tries to open its URL with the
  16.     help of some other application. This application must offer a service menu
  17.     that accepts either WebStep URIs or Plain Ascii Text that is interpreted as
  18.     a URL. The default value %URLService specifies the name of the service
  19.     menu item of the application in question, eg. to use Netsurfer(TM) the value
  20.     should be `Netsurfer/Open URL' If no value is found the cell tries to use
  21.     OmniWeb(TM).
  22.     
  23. "*/
  24.  
  25. //---------------------------------------------------------------------------------------
  26.     + initialize
  27. //---------------------------------------------------------------------------------------
  28.  
  29. /*" Stores the uniqued string 'WebStep Universal Resource Identifier 1.0' in the
  30.     global variable #W3URIPboardType. "*/
  31.  
  32.     {
  33.     W3URIPboardType=NXUniqueStringNoCopy("WebStep Universal Resource Identifier 1.0");
  34.     return self;
  35.     }
  36.     
  37.  
  38. //---------------------------------------------------------------------------------------
  39.     - init;
  40. //---------------------------------------------------------------------------------------
  41.     
  42. /*" Initialises and returns the receiver, a new icon Cell instance (that is, its 
  43.     type is NX_ICONCELL) with a NULL-URI. The icon is set to an
  44.     NXImage with the name `URI' that should be located in an appropriate place.
  45.     If it is not found, the Cell wont be initialised and %nil is returned. "*/
  46.         
  47.     {
  48.     NXImage *uriTiff=[NXImage findImageNamed:"URI"];
  49.     
  50.     if(!uriTiff)
  51.         return nil;
  52.     [super init];
  53.     [self setIcon:"URI"];
  54.     return self;    
  55.     }
  56.  
  57.  
  58. //---------------------------------------------------------------------------------------
  59.     - initURICell:(const char *)aURI;
  60. //---------------------------------------------------------------------------------------
  61.  
  62. /*" Initialises and returns the receiver, a new icon Cell instance (that is, its
  63.     type is NX_ICONCELL) with the specified URI. The icon is set to an
  64.     NXImage with the name `URI' that should be located in an appropriate place.
  65.     If it is not found, the Cell wont be initialised and %nil is returned. "*/
  66.  
  67.     {
  68.     if(![self init])
  69.         return nil;
  70.     [self setURI:aURI];
  71.     return self;
  72.     }
  73.  
  74.  
  75. //---------------------------------------------------------------------------------------
  76.     - (void)setURI:(const char *)aURI;
  77. //---------------------------------------------------------------------------------------
  78.     
  79. /*" Copies %aURI as the receiver's contents. "*/
  80.  
  81.     {
  82.     if(uri)
  83.         NXZoneFree([self zone],uri);
  84.     uri=NXCopyStringBufferFromZone(aURI,[self zone]);
  85.     }
  86.     
  87.  
  88. //---------------------------------------------------------------------------------------
  89.     - (const char *)uri;
  90. //---------------------------------------------------------------------------------------
  91.  
  92. /*" Returns the URI that the Cell represents "*/
  93.  
  94.     {
  95.     return uri;
  96.     }    
  97.     
  98.  
  99. //---------------------------------------------------------------------------------------
  100.     + (BOOL)prefersTrackingUntilMouseUp;
  101. //---------------------------------------------------------------------------------------
  102.  
  103. /*" Since we want "our" cell to be dragged around everywhere we return #YES. "*/
  104.  
  105.     {
  106.     return YES;
  107.     }
  108.  
  109.  
  110. //---------------------------------------------------------------------------------------
  111.     - (BOOL)trackMouse:(NXEvent *)theEvent inRect:(const NXRect *)cellFrame ofView:aView
  112. //---------------------------------------------------------------------------------------
  113.  
  114. /*" Intercepts the handling of mouse events at the lowest level possible
  115.     because this Cell class needs acess to the event structure of the mouse down
  116.     event.
  117.     
  118.     This method first changes the window's event mask to also reveive 
  119.     #NX_MOUSEDRAGGED events and then waits for the next event. In case of
  120.     an #NX_MOUSEDRAGGED event it places its URI on the drag pasteboard and calls 
  121.     #dragImage:at:offset:event:pasteboard:source:slideBack message in its control
  122.     view. In case of an #NX_MOUSEUP event with #click being 2 
  123.     (that is, a double-click) it also places the URI on the drag pasteboard and
  124.     then invokes the specifed service. "*/ 
  125.  
  126.     {
  127.     Window        *window;
  128.     int            oldMask;
  129.     NXEvent        theMDEvent;
  130.     NXPoint        p0={0,0},origin=cellFrame->origin;
  131.     NXAtom        pbType[]={W3URIPboardType, NXAsciiPboardType, NULL};
  132.     Pasteboard     *pBoard=[Pasteboard newName:NXDragPboard];
  133.     const char    *serviceName;
  134.  
  135.     if(uri==NULL)
  136.         return NO;
  137.  
  138.     window=[aView window];
  139.     theMDEvent=*theEvent;
  140.     oldMask=[window addToEventMask:NX_MOUSEDRAGGEDMASK];
  141.     theEvent=[NXApp getNextEvent:NX_MOUSEUPMASK|NX_MOUSEDRAGGEDMASK];
  142.     [window setEventMask:oldMask];
  143.  
  144.     if(theEvent->type==NX_MOUSEDRAGGED)
  145.         {
  146.         [pBoard declareTypes:pbType num:2 owner:self];
  147.         [pBoard writeType:W3URIPboardType data:uri length:strlen(uri)];
  148.         [aView dragImage:[NXImage findImageNamed:[self icon]] at:&origin
  149.              offset:&p0 event:&theMDEvent pasteboard:pBoard source:self slideBack:YES];
  150.         }
  151.     else if(theEvent->type==NX_MOUSEUP && theEvent->data.mouse.click==2)
  152.         {
  153.         [pBoard declareTypes:pbType num:2 owner:self];
  154.         [pBoard writeType:W3URIPboardType data:uri length:strlen(uri)];
  155.         serviceName=[NXApp defaultValue:"URLService"];
  156.         if(!serviceName)
  157.             serviceName="OmniWeb/Open URL";
  158.         NXPerformService(serviceName,pBoard);        
  159.         }
  160.  
  161.     return NO;
  162.     }
  163.  
  164.  
  165. //---------------------------------------------------------------------------------------
  166.     - (NXDragOperation)draggingSourceOperationMaskForLocal:(BOOL)flag;
  167. //---------------------------------------------------------------------------------------
  168.  
  169. /*" Always returns #NX_DragOperationCopy. "*/
  170.  
  171.     {
  172.     return NX_DragOperationCopy;
  173.     }
  174.     
  175.  
  176. //---------------------------------------------------------------------------------------
  177.     - pasteboard:sender provideData:(NXAtom)datatype;
  178. //---------------------------------------------------------------------------------------
  179.  
  180. /*" Initially only the `WebStep Universal Resource Identifier' is placed on
  181.     the pasteboard. If the receiver insists on getting the standard ASCII
  182.     representation it is provided lazily through this method. "*/
  183.  
  184.     {
  185. #if DEBUG
  186.     fprintf(stderr,"%s: receiver preferes %s\n",[[self class] name],datatype);
  187. #endif
  188.     if(datatype!=NXAsciiPboardType || uri==NULL)
  189.         return nil;
  190.     [sender writeType:datatype data:uri length:strlen(uri)];
  191.     return self;
  192.     }
  193.  
  194. //---------------------------------------------------------------------------------------
  195.     @end
  196. //---------------------------------------------------------------------------------------
  197.  
  198.  
  199.